<?php

namespace Mouta\AmistateBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Gedmo\Sluggable\Util\Urlizer;
use Mouta\AmistateBundle\Entity\Usuario;
use Mouta\AmistateBundle\Entity\Tags;
use Mouta\AmistateBundle\Helper\Strings;

class ListController extends Controller
{
	const LIMIT = 21;
	
	protected static $_Orden = array('18','1','19','2','3','4','5','6','7','8','9','10',
        '11','12','13','14','15','16','17','20','21','22','23','24','25','26','27','28','29','30',
        '31','32','33','34','35','36','37','38','39','40','41','42','43','190');
	
    public function indexAction($page = 1)
    {
		$limit = self::LIMIT;
        $offset = ($page-1) * $limit;
		
		$seoPage = $this->container->get('sonata.seo.page');
		$seoPage
			->setTitle('Amigos, Contactos gratis, Busco hombre, Busco Mujer, Amor online'. (($page > 1)?' - Página '.$page:''))
			->addMeta('name', 'description', 'Mujeres y Hombres de todo el mundo conectados para hacer Amigos online gratis, Buscar chicos y chicas para contactos, intercambios de fotos y videos'. (($page > 1)?' - Página '.$page:''))
		;
		
		$result = $this->get('solr_manager')->find('*:*',$offset,$limit);
		$filtros = $this->getFiltros(array());
		
		$paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
            $result['usuarios'],
            $page/*page number*/,
            $limit/*limit per page*/
        );
        $pagination->setUsedRoute('homePaged');
        $pagination->setTotalItemCount($result['total']);
		
		$bread = $this->getBreadcrumb();
		
        return $this->render('AmistateBundle:List:index.html.twig',array(
			'filtros'=>$filtros,
			'bread'=>$bread,
			'usuarios'=>$result['usuarios'],
			'pagination' => $pagination
		));
    }
	
    public function lindasAction($page = 1, $sexo = 1)
    {
		$limit = self::LIMIT;
        $offset = ($page-1) * $limit;
		
		$result = $this->get('solr_manager')->find('sexo:'.$sexo,$offset,$limit,array('sort'=>'tienefoto desc, puntos desc'));
		$filtros = $this->getFiltros(array());
		
		$paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
            $result['usuarios'],
            $page/*page number*/,
            $limit/*limit per page*/
        );
        $pagination->setTotalItemCount($result['total']);
		
		$seoPage = $this->container->get('sonata.seo.page');
		if($sexo)
		{
			$seoPage
				->setTitle('Las mujeres más bellas - Fotos de las más lindas'. (($page > 1)?' - Página '.$page:'') )
				->addMeta('name', 'description', 'Encontra las Mujeres más bellas del mundo, fotos y videos de las chicas más bellas'. (($page > 1)?' - Página '.$page:''))
			;
			$pagination->setUsedRoute('mas_lindasPaged');
			$pagination->setParam('sexo',1);
		} else {
			$seoPage
				->setTitle('Los hombres más guapos - Fotos de los más lindos'. (($page > 1)?' - Página '.$page:'') )
				->addMeta('name', 'description', 'Encontra los Hombres más guapos del mundo, fotos y videos de las chicos más lindos'. (($page > 1)?' - Página '.$page:''))
			;
			$pagination->setUsedRoute('mas_lindosPaged');
			$pagination->setParam('sexo',0);
		}
		
		$bread = $this->getBreadcrumb();
		
        return $this->render('AmistateBundle:List:index.html.twig',array(
			'filtros'=>$filtros,
			'bread'=>$bread,
			'usuarios'=>$result['usuarios'],
			'pagination' => $pagination
		));
    }
	
    public function tagsAction($tag1, $tag2 = null, $tag3 = null, $page = 1)
    {
		$limit = self::LIMIT;
        $offset = ($page-1) * $limit;
		
		$tags = array();
		if($tag1) $tags[] = $tag1;
		if($tag2) $tags[] = $tag2;
		if($tag3) $tags[] = $tag3;
		$tagsDao = $this->getDoctrine()->getManager()->getRepository('AmistateBundle:Tags')->findTags($tags);
		
		if(count($tags) == (count($tagsDao)+1) )
        {//es porque viene el tag de ubicacion 
            $ta = array();
            foreach($tagsDao as $td){
                $ta[] = $td->getTagGoogle();
            }
            foreach($tags as $t){
                if (!in_array($t,$ta)) {
					
					$result = $this->get('solr_manager')->find('tags:'.$t.'-*',0,1);
					if($result['total'] > 0)
					{
                        $return = $result['usuarios'][0]->GetPais();
                        if( $result['usuarios'][0]->getSeoPais().'-' . $result['usuarios'][0]->getSeoProvincia() == $t )
                            $return .= ', ' . $result['usuarios'][0]->getProvincia();
                        
                        if( $result['usuarios'][0]->getSeoPais().'-' . $result['usuarios'][0]->getSeoProvincia() . '-' . $result['usuarios'][0]->getSeoLocalidad() == $t )
                            $return .= ', '. $result['usuarios'][0]->getProvincia(). ', ' . $result['usuarios'][0]->getLocalidad();
						
                        $tag = new Tags();
                        $tag->setIdForm(1);
						$tag->setTag($return);
						$tag->setTagGoogle($t);
                        
                        $tagsDao[] = $tag;
					}
                    else
                    {
                        /*
                         * cuando un usuario está en una ubicacion y en esa ubicacion está solo ese usuario y ese usuario está para validar,
                         * la busqueda a solr no devuelve nada, entonces lo que hacemos es generar un tag con los datos para las urls del tipo:
                         * /zaraza/ o /tag/zaraza/
                        */
                        $tag = new Tags();
                        $tag->setIdForm(1);
                        $tag->setTag($t);
                        $tag->setTagGoogle($t);

                        $tagsDao[] = $tag;
                    }
                }
            }
        }
		
        $isValid = self::validateUrlList($tags,$tagsDao);
        if(!$isValid)
        {//url mal formada
            throw $this->createNotFoundException('Invalid URL');
        }
		
		$tagsDao = self::getTagsOrdenados($tagsDao);
		
		$result = $this->get('solr_manager')->find($this->getQuerySolr($tagsDao),$offset,$limit);
		
		$filtros = $this->getFiltros($tagsDao);
		
		$paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
            $result['usuarios'],
            $page/*page number*/,
            $limit/*limit per page*/
        );
		switch (count($tagsDao)) {
			case 1:
				$pagination->setUsedRoute('list1Paged');
				break;
			case 2:
				$pagination->setUsedRoute('list2Paged');
				break;
			case 3:
				$pagination->setUsedRoute('list3Paged');
				break;
			default:
				$pagination->setUsedRoute('homePaged');
				break;
		}
        $pagination->setTotalItemCount($result['total']);
		
		$bread = $this->getBreadcrumb($tagsDao);
		
		$descripcion = "";
        $title = "Busco amistad, amigos, mujeres y hombres, contactos";
        switch (count($tagsDao)) {
            case 1://un solo tag
                switch ($tagsDao[0]->getIdForm()) {
                    case 1:
                        $title = "Mujeres en {$tagsDao[0]->getTag()}, Hombres en {$tagsDao[0]->getTag()}, Amigos en {$tagsDao[0]->getTag()}, Contactos en {$tagsDao[0]->getTag()}";
                        break;
                    case 18:
                        $title = "Busco {$tagsDao[0]->getTag()}, Amigos {$tagsDao[0]->getTag()}, Contactos {$tagsDao[0]->getTag()}";
                        break;
                    case 19:
                        $title = "Busco {$tagsDao[0]->getTag()}, Mujeres para {$tagsDao[0]->getTag()}, Hombres para {$tagsDao[0]->getTag()}, Amigos para {$tagsDao[0]->getTag()}, Contactos para {$tagsDao[0]->getTag()}";
                        break;
                    default:
                        $title = "Busco {$tagsDao[0]->getTag()}, Mujeres {$tagsDao[0]->getTag()}, Hombres {$tagsDao[0]->getTag()}, Amigos {$tagsDao[0]->getTag()}";
                        break;
                }
                break;
            case 2://2 tags
                $title = "Amigos {$tagsDao[0]->getTag()}, Contactos {$tagsDao[1]->getTag()}";
                break;
            case 3://3 tags
                $title = "Busco {$tagsDao[0]->getTag()}, Contactos {$tagsDao[1]->getTag()}, Contactos {$tagsDao[2]->getTag()}";
                break;
            default:
                break;
        }
        $title = Strings::recortar($title, 70);
        if($page > 1)
            $title .= " - Página $page";
        if(isset($result['usuarios'][0]))
            $descripcion = $title . " ". $result['usuarios'][0]->getDescripcion();
        $descripcion = Strings::recortar($descripcion , 160);
		
		$seoPage = $this->container->get('sonata.seo.page');
		$seoPage
			->setTitle($title)
			->addMeta('name', 'description', $descripcion)
		;
		
        return $this->render('AmistateBundle:List:index.html.twig',array(
			'filtros'=>$filtros,
			'bread'=>$bread,
			'usuarios'=>$result['usuarios'],
			'pagination' => $pagination
		));
    }
	
	
	public function getFiltros($tags)
    {
        $tagsDao = array();
        foreach($tags as $tag){
            if($tag->getIdForm() == 1 || $tag->getIdForm() == 18 || $tag->getIdForm() == 19 )
                $tagsDao[$tag->getIdForm()] = $tag;
        }
        
        $quitarSexo = 'Por género';
        $quitarPais = 'Por país';
        $quitarPara = 'Para';
        
        $tagsSexo = $tagsDao;
        if(isset($tagsSexo[18])){
            $quitarSexo = ucfirst($tagsSexo[18]->getTag()) ;
            unset ($tagsSexo[18]);
        }
            
		$params = array('facet'=>'on','facet.field'=>'sexo');
		$result = $this->get('solr_manager')->find($this->getQuerySolr($tagsSexo),0,0,$params);
		$filtroSexo[Usuario::getOpcionesSexo(true)] = $result['facets']['true'];
        $filtroSexo[Usuario::getOpcionesSexo(false)] = $result['facets']['false'];
        
        $tagsPais = $tagsDao;
        if(isset($tagsPais[1])){
            $quitarPais = $tagsPais[1]->getTag();
            unset ($tagsPais[1]);
        }
        
		$params = array('facet'=>'on','facet.field'=>'pais');
		$result = $this->get('solr_manager')->find($this->getQuerySolr($tagsPais),0,0,$params);
		$filtroAuxPais = $result['facets'];
		
		$filtroPais = $result['facets'];
		
        $tagsPara = $tagsDao;
        if(isset($tagsPara[19])){
            $quitarPara = $tagsPara[19]->getTag();
            unset ($tagsPara[19]);
        }
		
		$params = array('facet'=>'on','facet.field'=>'para');
		$result = $this->get('solr_manager')->find($this->getQuerySolr($tagsPara),0,0,$params);
		$filtroIdPara = $result['facets'];
		$filtroPara = array();
		foreach($filtroIdPara as $idPara => $cant)
		{
			$filtroPara[Usuario::getOpcionesPara($idPara)] = $cant;
		}
		
        return array(
			'filtroSexo'=>$filtroSexo,
			'tagsSexo'=>$tagsSexo,
			'quitarSexo'=>$quitarSexo,
			'filtroPais'=>$filtroPais,
            'tagsPais'=>$tagsPais,
			'quitarPais'=>$quitarPais,
			'filtroPara'=>$filtroPara,
			'tagsPara'=>$tagsPara,
			'quitarPara'=>$quitarPara
		);
    }
	
	protected function getQuerySolr($tagsDao){
        if(count($tagsDao)==0)
            return '*:*';
        
        $querySolr = array();
        foreach($tagsDao as $txtTag){
            if($txtTag->getIdForm()==1){
                $querySolr[] = "tags:". $txtTag->getTagGoogle() ."-*";
            }elseif($txtTag->getIdForm()==19){
                $opciones = Usuario::getOpcionesPara();
                $agregado = false;
                foreach($opciones as $key => $opcion){
                    if(Urlizer::urlize($opcion) == $txtTag->getTagGoogle() ){
                        $querySolr[] = "para:".$key;
                        $agregado = true;
                    }
                }
                if(!$agregado)
                    $querySolr[] = "tags:".$txtTag->getTagGoogle();
            }else{
                $mujer = Urlizer::urlize(Usuario::getOpcionesSexo(true));
                $hombre = Urlizer::urlize(Usuario::getOpcionesSexo(false));
                if($mujer == $txtTag->getTagGoogle()){
                    $querySolr[] = "sexo:true";
                }elseif($hombre == $txtTag->getTagGoogle()){
                    $querySolr[] = "sexo:false";
                }else{
                    $querySolr[] = "tags:".$txtTag->getTagGoogle();
                }
            }
        }
        
        return implode(' AND ', $querySolr);
    }
	
	public static function validateUrlList(array $tagsInUrl, $tagsDao){
        if( count($tagsDao)!=count($tagsInUrl) )
            return false;

        //ordeno los tagsDao como en la url
        $aux = array();
        foreach($tagsInUrl as $tu){
            foreach($tagsDao as $td){
                if(strpos($td->getTagGoogle(), $tu) !== false)
				{//comparo porque para los paises tengo por ejemplo argentina-buenos-aires y en la url solo argentina
					$aux[] = $td;
				}
            }
        }

        $tagsOrdenados = self::getTagsOrdenados($aux);

        for($i=0; $i<3; $i++){
            if(isset($tagsInUrl[$i]))
            {
                if(strpos($tagsOrdenados[$i]->getTagGoogle(), $tagsInUrl[$i]) === false)
                    return false;
            }
        }

        return true;
    }

    public static function getTagsOrdenados($tags){
        $tagsOrdenados = array();
        foreach (self::$_Orden as $id_form){
            foreach($tags as $tag){
                if($tag->getIdForm() == $id_form)
                    $tagsOrdenados[] = $tag;
            }
        }
        return $tagsOrdenados;
    }
	
	public function getBreadcrumb($tags = array())
    {
        $bread = array();
        
        if(isset($tags[0])){
            if($tags[0]->getIdForm() == 18 )
            {
                $bread[$tags[0]->getTagGoogle()] = "Busco ". ucfirst( $tags[0]->getTag() );
            }else{
                $bread[$tags[0]->getTagGoogle()] = "Amigos - Contactos ". ucfirst( $tags[0]->getTag() );
            }
        }
        
        if(isset($tags[1])){
            if($tags[1]->getIdForm() == 1 )
            {
                $bread[$tags[1]->getTagGoogle()] = "Amigos en ".ucfirst($tags[1]->getTag());
            }else{
                $bread[$tags[1]->getTagGoogle()] = ucfirst( $tags[1]->getTag() );
            }
        }
        if(isset($tags[2])){
            $bread[$tags[2]->getTagGoogle()] = "Amigos para ".ucfirst( $tags[2]->getTag() );
        }
		
		return $bread;
    }
	
}
